//
//  GAKKIBaseViewController.h
//  GANGAIKit
//
//  Created by fh on 2019/11/5.
//  Copyright © 2019 cashchina. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <Masonry/Masonry.h>
#import "GAKKIConfig.h"

NS_ASSUME_NONNULL_BEGIN

/// 控制器基类
@interface GAKKIBaseViewController : UIViewController

/// 用于屏幕尺寸不够的子View滚动容器
@property (nonatomic, readonly, strong) UIScrollView *contentScrollView;
/// 用于屏幕尺寸不够的子View容器
@property (nonatomic, readonly, strong) UIView *contentView;

/// 是否需要在控制器viewDidLoad后调用setupView方法进行UI布局,默认YES,需要子类实现setupView方法
@property (nonatomic, readwrite, assign) BOOL shouldAutoConfigureViewOnViewDidLoad;
/// 是否需要在控制器viewDidLoad后调用requestRemoteData方法请求网络数据,默认YES,需要子类实现setupView方法
@property (nonatomic, readwrite, assign) BOOL shouldRequestRemoteDataOnViewDidLoad;
/// 是否隐藏该控制器的导航栏 默认是不隐藏 (NO)
@property (nonatomic, readwrite, assign) BOOL prefersNavigationBarHidden;

/// 分页标题:提供给容器设置菜单栏用
@property (nonatomic, strong) NSString *pageTitle;

/// 创建对象
+ (instancetype)new;

/// 初始化
- (instancetype)init;

/// 用传递参数初始化
/// @param params 传递参数
- (instancetype)initWithParams:(NSDictionary * __nullable)params;

/// 用传递参数初始化并自定义属性设置
/// @param params 传递参数
/// @param settingBlock 自定义配置回调
- (instancetype)initWithParams:(NSDictionary * __nullable)params settingBlock:(void(^ __nullable)(GAKKIBaseViewController *vc))settingBlock;

/// 布局:子类实现进行布局
- (void)setupView;

/// 请求网络数据:子类实现，不需要调用父类
- (void)requestRemoteData;

/// 存储数据到本地/数据库:子类实现,基类只是提供接口
- (void)storeIntoDBData;

/// 获取本地数据/数据库:子类实现,基类只是提供接口
- (void)fetchDBData;

/// 可以滚动布局:在block里添加子控件，添加到contentView上并设置约束,最后需要设置contentView的底部或右边的约束,参考masonry的scrollView布局约束方法
/// @param isHorizontal 是否是水平滚动
/// @param contentViewBlock 内容父类视图
- (void)configScrollableViewWithDirection:(BOOL)isHorizontal realSuperContentViewCallbackBlock:(void(^)(UIView *contentView))contentViewBlock;


@end



/// 指示功能
@interface GAKKIBaseViewController (Indicate)

/// 简单文本弹框提醒
/// @param remindText 弹框文本
- (void)showTipViewWithInfo:(NSString * __nullable)remindText;

/// 简单文本弹框提醒
/// @param remindText 弹框文本
/// @param view 父视图
- (void)showTipViewWithInfo:(NSString * __nullable)remindText toView:(UIView * __nullable)view;

/// 简单加载中提醒
/// @param remindText 加载文本
- (void)showLoadingWithRemindText:(NSString * __nullable)remindText;

/// 简单加载中提醒
/// @param remindText 加载文本
/// @param view 父视图
- (void)showLoadingWithRemindText:(NSString * __nullable)remindText toView:(UIView * __nullable)view;

/// 隐藏加载提醒
- (void)hiddenLoadingRemindText;

@end



/// 导航栏控件功能
@interface GAKKIBaseViewController (FastNavigationItem)

/// 快速添加左边按钮: 后续需要根据项目修改需求,需要修改同一字体样式和大小
/// @param title 按钮标题
/// @param actionBlock 按钮方法:回调出生成的UIBarButtonItem和自身的弱引用便于外部调用
- (void)addFastLeftBarButtonItemWithTitle:(NSString *)title action:(void(^)(UIBarButtonItem *item, GAKKIBaseViewController *blockInnerWeakSelf))actionBlock;

/// 快速添加左边按钮: 后续需要根据项目修改需求,需要修改同一字体样式和大小
/// @param imgStr 图片名称
/// @param actionBlock 按钮方法:回调出生成的UIBarButtonItem和自身的弱引用便于外部调用
- (void)addFastLeftBarButtonItemWithImageStr:(NSString *)imgStr action:(void(^)(UIBarButtonItem *item, GAKKIBaseViewController *blockInnerWeakSelf))actionBlock;

/// 快速添加右边按钮: 后续需要根据项目修改需求,需要修改同一字体样式和大小
/// @param title 按钮标题
/// @param actionBlock 按钮方法:回调出生成的UIBarButtonItem和自身的弱引用便于外部调用
- (void)addFastRightBarButtonItemWithTitle:(NSString *)title action:(void(^)(UIBarButtonItem *item, GAKKIBaseViewController *blockInnerWeakSelf))actionBlock;

/// 快速添加右边按钮: 后续需要根据项目修改需求,需要修改同一字体样式和大小
/// @param imgStr 图片名称
/// @param actionBlock 按钮方法:回调出生成的UIBarButtonItem和自身的弱引用便于外部调用
- (void)addFastRightBarButtonItemWithImageStr:(NSString *)imgStr action:(void(^)(UIBarButtonItem *item, GAKKIBaseViewController *blockInnerWeakSelf))actionBlock;

/// 自定义返回方法
/// @param actionBlock 按钮方法
- (void)customLeftBarButtonItemActionWithAction:(void(^)(UIBarButtonItem *item, GAKKIBaseViewController *blockInnerWeakSelf))actionBlock;

@end

NS_ASSUME_NONNULL_END
